package xin.key
{
	/**
	 * 热键数据结构
	 * @author xin
	 */	
	public class HotKeyVo
	{
		/////////////////////////////////////////////按键的状态status
		/**
		 * 按下
		 */		
		public static const STATUS_DOWN:int = 0;
		/**
		 * 弹起
		 */		
		public static const STATUS_UP:int = 1;
		
		///////////////////////////////////////////// 定义mode按键启用模式的常量
		/**
		 * 按键 按下并弹起时触发模式: 0
		 */		
		public static const MODE_DOWN_UP:int = 0;
		/**
		 * 仅按键 按下模式: 1
		 */		
		public static const MODE_DOWN:int = 1;
		
		//键码
		private var _keyCode:uint;
		//回调函数
		private var _callBack:Function;
		//启用按键的模式
		private var _mode:int;
		//是否可用
		private var _blActive:Boolean;
		//按键的状态
		private var _status:int;
		
		/**
		 * 构造函数
		 * @param keyCode 按键编码
		 * @param callBack 回调函数
		 * @param mode 启用该按键的模式
		 */		
		public function HotKeyVo(keyCode:uint, callBack:Function, mode:int)
		{
			this._keyCode = keyCode;
			this._callBack = callBack;
			this._mode = mode;
			
			//默认启用该键码
			this._blActive = true;
			//默认键是up状态
			this._status = HotKeyVo.STATUS_UP;
		}
		
		/**
		 * 获取键码
		 */		
		public function get keyCode():uint
		{
			return this._keyCode;
		}
		
		/**
		 * 按键按下的回调函数
		 */		
		public function onKeyDown():void
		{
			// 如果是"按下并弹起"才启用的热键, 在"按下"状态是不触发回调函数的
			if (this._mode == HotKeyVo.MODE_DOWN_UP)
			{
				return;
			}
			
			//记录状态
			this._status = HotKeyVo.STATUS_DOWN;
			
			//执行回调
			try
			{
				this._callBack.apply(null, [this]);
			}
			catch (e:Error)
			{
				trace(e.message);
			}
		}
		
		/**
		 * 当按键弹起时回调函数
		 */		
		public function onKeyUp():void
		{
			//当之前状态必须是"按下"时才能触发, 且当前按键触发模式不能是"仅在按下"模式
			if (this._status == HotKeyVo.STATUS_UP && this._mode != HotKeyVo.MODE_DOWN)
			{
				//执行回调
				try
				{
					this._callBack.apply(null, [this]);
				}
				catch (e:Error)
				{
					trace(e.message);
				}
			}
			
			//记录状态
			this._status = HotKeyVo.STATUS_UP;
		}
		
		/**
		 * 获取按键是否是按下状态
		 */		
		public function get isKeyDown():Boolean
		{
			return this._status == HotKeyVo.STATUS_DOWN;
		}
		
		/**
		 * 重置按键状态(恢复为弹起状态);
		 */		
		public function reset():void
		{
			this._status = HotKeyVo.STATUS_UP;
		}
		
		/**
		 * 设置按键激活状态
		 */		
		public function set active(value:Boolean):void
		{
			this._blActive = value;
			
			//设置结束 重置按键状态
			this.reset();
		}
		
		/**
		 * 返回按键是否是激活状态
		 */		
		public function get active():Boolean
		{
			return this._blActive;
		}
	}
}